package 反射;


import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
class Studentb {
	private String name;
	private String no;
	public String nickname;
	public Studentb(String name,String no,String nickname) {
		this.name=name;
		this.no=no;
		this.nickname=nickname;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getNo() {
		return no;
	}
	public void setNo(String no) {
		this.no = no;
	}
	public String getNickname() {
		return nickname;
	}
	public void setNickname(String nickname) {
		this.nickname = nickname;
	}
}
public final class test1 {
	public static void main(String[] args) throws Exception{
		Method method=Studentb.class.getDeclaredMethod("setName", String.class);
//		List<String> list=getParameterNames(method);
		int count=method.getParameterCount();
		System.out.println(count);
		//Object[] obj=method.getParameters();
		Parameter[] parameters = method.getParameters();
		System.out.println(Arrays.deepToString(parameters));
		for (Parameter parameter:parameters) {
			String parameterName = parameter.getName();
			System.out.println(parameterName);
			System.out.println(parameter.isNamePresent());
		}
	}
  public static List<String> getParameterNames(Method method) {
    Parameter[] parameters = method.getParameters();
    List<String> parameterNames = new ArrayList<>();
    for (Parameter parameter : parameters) {
      if(!parameter.isNamePresent()) {

//  	  默认情况下，我们是无法获取方法中参数名称的。通过反射机制，也只能得到参数的顺序以及一些没有意义的变量：arg0、arg1等等。
//  	  但我们又确实需要这部分信息。比如IDE的自动提示，文档化服务接口的详细信息等。
//  	  这是因为，这些变量的名字，根本就没有编译进class文件中，它不可能凭空产生。
//  	  在JDK 8之后，可以通过在编译时指定-parameters选项，将方法的参数名记入class文件，并在运行时通过反射机制获取相关信息。
//  	  如果你的项目是实用maven构建，那么就可以加入几行配置，追加参数。
//  	  <plugin>  
//  	      <artifactId>maven-compiler-plugin</artifactId>  
//  	      <version>3.8.0</version>  
//  	      <configuration>  
//  	          <source>1.8</source>  
//  	          <target>1.8</target>  
//  	          <encoding>utf8</encoding>  
//  	          <compilerArgs>  
//  	              <arg>-parameters</arg>  
//  	          </compilerArgs>  
//  	      </configuration>  
//  	  </plugin>  
        throw new IllegalArgumentException("Parameter names are not present!");
      }
      String parameterName = parameter.getName();
      parameterNames.add(parameterName);
    }
    return parameterNames;
  }
//  private test1(){}
}